package be.ipl.finito.servlets;

import java.io.IOException;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Timer;
import java.util.TimerTask;

import javax.ejb.EJB;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import be.ipl.finito.domaine.Joueur;
import be.ipl.finito.domaine.Partie;
import be.ipl.finito.exceptions.ArgumentInvalideException;
import be.ipl.finito.exceptions.JoueurDejaInscritException;
import be.ipl.finito.exceptions.JoueurInExistantException;
import be.ipl.finito.exceptions.PartieException;
import be.ipl.finito.exceptions.PartieInExistanteException;
import be.ipl.finito.usecases.GestionJoueur;
import be.ipl.finito.usecases.GestionPartie;

public class CreerPartie extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@EJB
	private GestionPartie gestionPartie;
	@EJB
	private GestionJoueur gestionJoueur;


	public CreerPartie() {
		super();
	}

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		RequestDispatcher rd = null;
		if (req.getSession().getAttribute("pseudo") == null) {
			resp.sendRedirect("index.html");
			return;
		} else if (req.getSession().getAttribute("pseudo") != null
				&& req.getSession().getAttribute("idpartie") == null) {
			rd = getServletContext().getNamedDispatcher("frontmenu.html");
			rd.forward(req, resp);
			return;
		}
		
		int idPartie = (Integer) req.getSession().getAttribute("idpartie");
		Joueur j = gestionJoueur.chercherJoueur((String) req.getSession().getAttribute("pseudo"));
		
		try {
			//Partie p = gestionPartie.commencerPartie(idPartie, j);
			if (gestionPartie.estCommencee(idPartie)) {
				req.setAttribute("debut", true);
				req.getSession().setAttribute("tour", 1);
				// rd =
				// getServletContext().getRequestDispatcher("/WEB-INF/jsp/plateau.jsp");
				req.setAttribute("message", "Partie commence");
				req.setAttribute("pMessage", "messageOk");
				req.setAttribute("idpartie", idPartie);
				//rd = getServletContext().getNamedDispatcher("plateau.html");
				
				//rd = getServletContext().getRequestDispatcher("/WEB-INF/jsp/plateau.jsp");
				rd = getServletContext().getNamedDispatcher("plateau.html");
				rd.forward(req, resp);
				return;
			} else if (gestionPartie.estAnnulee(idPartie)) {
				req.getSession().removeAttribute("idpartie");
				req.setAttribute("message",
						"Pas assez de joueur, la partie est annulée !");
				req.setAttribute("pMessage", "messagePasOk");
				rd = getServletContext().getNamedDispatcher("index.html");
				req.setAttribute("annulee", true);
				rd.forward(req, resp);
				return;
			}
		} catch (PartieInExistanteException e) {
			e.printStackTrace();
		}
		rd = getServletContext().getRequestDispatcher(
				"/WEB-INF/jsp/attente.jsp");
		rd.forward(req, resp);

	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String nomPartie = (String) req.getParameter("nomPartie");
		Partie partie = null;
		Joueur joueur = null;
		try {
			joueur = gestionJoueur.chercherJoueur((String) req.getSession()
					.getAttribute("pseudo"));
			partie = gestionPartie.creerPartie(nomPartie);
			
			
			gestionPartie.rejoindrePartie(partie.getId(), joueur);
			req.getSession().setAttribute("idpartie", partie.getId());
			Timer t = new Timer();
			t.schedule(new MonTimer(partie.getId(), joueur.getLogin()),
					Partie.TEMPS * 1000);

			req.setAttribute("time", 30);
			req.setAttribute("source", "creerPartie");
			Calendar now = GregorianCalendar.getInstance();
			getServletContext().setAttribute("time" + partie.getId(), now);
			RequestDispatcher rd = getServletContext().getRequestDispatcher(
					"/WEB-INF/jsp/attente.jsp");
			rd.forward(req, resp);

		} catch (ArgumentInvalideException e) {
			e.printStackTrace();
		} catch (PartieInExistanteException e) {
			e.printStackTrace();
		} catch (JoueurInExistantException e) {
			e.printStackTrace();
		} catch (JoueurDejaInscritException e) {
			e.printStackTrace();
		} catch (PartieException e) {
			req.setAttribute("message", e.getMessage());
			req.setAttribute("pMessage", "messagePasOk");
			this.getServletContext().getNamedDispatcher("creeationPartie.html").forward(req, resp);
			return;
		}
	}

	class MonTimer extends TimerTask {

		private int idPartie;
		private String pseudo;

		public MonTimer(int idPartie, String pseudo) {
			super();
			this.idPartie = idPartie;
			this.pseudo = pseudo;
		}

		@Override
		public void run() {

			Joueur j;
			try {
				j = gestionJoueur.chercherJoueur(pseudo);
				if (gestionPartie.nbrJoueurs(idPartie) < Partie.NBR_MIN_JOUEURS) {
					getServletContext().removeAttribute("time" + idPartie);
					gestionPartie.annulerPartie(idPartie, j);
				} else {
					/*
					 * Je gere le fait que si 3 joueurs on rejoinds la partie
					 * alors le button "rejoindre" se met en "complet" et en disable
					 */
					Partie p = gestionPartie.commencerPartie(this.idPartie, j);
				}

			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (PartieInExistanteException e) {
				e.printStackTrace();
			} catch (JoueurInExistantException e) {
				e.printStackTrace();
			}

		}

	}

}
